// 闭包：有权访问另一个函数作用域中的变量
// 简单的例子：
function A() {
    let a = 10;
    function B() {
        console.log(a);
    };

    B();
};

A();  // 10


// 闭包容易造成内存泄漏
function C() {
    let c = 20;
    function D() {
        console.log(c);
    };

    return D;
};

let fn = C();
let res = fn();   // 20

/*
    为什么内存泄漏？
    C()执行之后，将其返回值D赋值给了fn，然后再调用fn()，实际上是通过不同的标识符引用调用了内部的函数D();  [容易理解]
    C()执行之后，正常情况下C()的整个内部作用域将会被销毁，占用的内存被回收 [容易理解]
    但是现在C的内部作用域D还在使用，所以不会对其进行回收，D()依然持有对该作用域的引用，这个引用就叫做闭包 [理解]
    这个函数在定义的词法作用域以外的地方被调用，闭包使得函数可以继续访问定义时的词法作用域 [理解]
*/



/*
    闭包怎么解决回收？
    
*/